/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arabicdictionary;

import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractListModel;
import javax.swing.event.HyperlinkEvent;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author yerzhan
 */
public class MainFrame extends javax.swing.JFrame {

    private static final int HISTORY_SIZE = 30;
    ArrayList<Article> articles = new ArrayList<>();
    ArrayList<Article> findings = new ArrayList<>();
    ArrayList<String> history = new ArrayList<>();

    /**
     * Creates new form MainFrame
     */
    public MainFrame() {
        initComponents();

        edtPaneTajwid.setCaretPosition(0);
        edtPaneGrammarPart1.setCaretPosition(0);
        edtPaneGrammarPart2.setCaretPosition(0);

        try {
            loadDictionary();
            txtArabic.requestFocusInWindow();
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }

        tableArticles.setModel(new AbstractTableModel() {
            @Override
            public int getRowCount() {
                return articles.size();
            }

            @Override
            public int getColumnCount() {
                return 12;
            }

            @Override
            public String getColumnName(int column) {
                switch (column) {
                    case 0:
                        return "Id";

                    case 1:
                        return "Base";

                    case 2:
                        return "Arabic";

                    case 3:
                        return "Kind";

                    case 4:
                        return "Add info 1";

                    case 5:
                        return "Add info 2";

                    case 6:
                        return "Add info 3";

                    case 7:
                        return "Add info 4";

                    case 8:
                        return "Add info 5";

                    case 9:
                        return "Add info 6";

                    case 10:
                        return "Add info 7";

                    case 11:
                        return "Russian";

                    default:
                        throw new AssertionError();
                }
            }

            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                Article a = articles.get(rowIndex);
                switch (columnIndex) {
                    case 0:
                        return a.id;

                    case 1:
                        return a.base;

                    case 2:
                        return a.arabic;

                    case 3:
                        return a.kind;

                    case 4:
                        return a.addInfo1;

                    case 5:
                        return a.addInfo2;

                    case 6:
                        return a.addInfo3;

                    case 7:
                        return a.addInfo4;

                    case 8:
                        return a.addInfo5;

                    case 9:
                        return a.addInfo6;

                    case 10:
                        return a.addInfo7;

                    case 11:
                        return a.russian;

                    default:
                        throw new AssertionError();
                }
            }
        });

        lstFindings.setModel(new AbstractListModel() {
            @Override
            public int getSize() {
                return findings.size();
            }

            @Override
            public Object getElementAt(int index) {
                return findings.get(index).arabic;
            }
        });
    }

    /**
     * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The content of this method is always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        txtArabic = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        txtRussian = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        lstFindings = new javax.swing.JList();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        txtAddInfo1 = new javax.swing.JTextField();
        txtAddInfo5 = new javax.swing.JTextField();
        txtAddInfo2 = new javax.swing.JTextField();
        txtAddInfo3 = new javax.swing.JTextField();
        txtKind = new javax.swing.JTextField();
        txtAddInfo6 = new javax.swing.JTextField();
        txtAddInfo4 = new javax.swing.JTextField();
        txtAddInfo7 = new javax.swing.JTextField();
        jScrollPane3 = new javax.swing.JScrollPane();
        txtArticle = new javax.swing.JTextArea();
        jScrollPane5 = new javax.swing.JScrollPane();
        edtPaneHistory = new javax.swing.JEditorPane();
        jScrollPane1 = new javax.swing.JScrollPane();
        tableArticles = new javax.swing.JTable();
        jScrollPane10 = new javax.swing.JScrollPane();
        edtPaneTajwid = new javax.swing.JEditorPane();
        jScrollPane4 = new javax.swing.JScrollPane();
        edtPaneGrammarPart1 = new javax.swing.JEditorPane();
        jScrollPane8 = new javax.swing.JScrollPane();
        edtPaneGrammarPart2 = new javax.swing.JEditorPane();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("messages"); // NOI18N
        setTitle(bundle.getString("arabic_dictionary_and_grammar")); // NOI18N
        setLocationByPlatform(true);

        jLabel1.setLabelFor(txtArabic);
        jLabel1.setText(bundle.getString("arabic")); // NOI18N

        txtArabic.setFont(new java.awt.Font("Times New Roman", 0, 18)); // NOI18N
        txtArabic.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
        txtArabic.setToolTipText("Alt + 1");
        txtArabic.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));
        txtArabic.setFocusAccelerator('1');
        txtArabic.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txtArabicKeyTyped(evt);
            }
        });

        jLabel2.setText(bundle.getString("matches")); // NOI18N

        txtRussian.setToolTipText("Alt + 2");
        txtRussian.setFocusAccelerator('2');
        txtRussian.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtRussianActionPerformed(evt);
            }
        });

        lstFindings.setFont(new java.awt.Font("Arial", 0, 48)); // NOI18N
        lstFindings.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        lstFindings.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                lstFindingsValueChanged(evt);
            }
        });
        lstFindings.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                lstFindingsKeyTyped(evt);
            }
        });
        jScrollPane2.setViewportView(lstFindings);

        jLabel3.setLabelFor(txtRussian);
        jLabel3.setText(bundle.getString("russian")); // NOI18N

        jLabel4.setText(bundle.getString("kind")); // NOI18N

        jLabel5.setText(bundle.getString("add_info1")); // NOI18N

        jLabel6.setText(bundle.getString("add_info2")); // NOI18N

        jLabel7.setText(bundle.getString("add_info3")); // NOI18N

        jLabel8.setText(bundle.getString("add_info4")); // NOI18N

        jLabel9.setText(bundle.getString("add_info5")); // NOI18N

        jLabel10.setText(bundle.getString("add_info6")); // NOI18N

        jLabel11.setText(bundle.getString("add_info7")); // NOI18N

        jLabel12.setText(bundle.getString("article")); // NOI18N

        txtAddInfo1.setEditable(false);

        txtAddInfo5.setEditable(false);
        txtAddInfo5.setFont(new java.awt.Font("Times New Roman", 0, 24)); // NOI18N

        txtAddInfo2.setEditable(false);

        txtAddInfo3.setEditable(false);
        txtAddInfo3.setFont(new java.awt.Font("Times New Roman", 0, 24)); // NOI18N

        txtKind.setEditable(false);

        txtAddInfo6.setEditable(false);

        txtAddInfo4.setEditable(false);

        txtAddInfo7.setEditable(false);
        txtAddInfo7.setFont(new java.awt.Font("Times New Roman", 0, 24)); // NOI18N

        txtArticle.setEditable(false);
        txtArticle.setColumns(20);
        txtArticle.setFont(new java.awt.Font("Times New Roman", 0, 24)); // NOI18N
        txtArticle.setLineWrap(true);
        txtArticle.setRows(5);
        txtArticle.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txtArticleKeyTyped(evt);
            }
        });
        jScrollPane3.setViewportView(txtArticle);

        edtPaneHistory.setEditable(false);
        edtPaneHistory.setContentType("text/html"); // NOI18N
        edtPaneHistory.setFont(new java.awt.Font("Times New Roman", 0, 24)); // NOI18N
        edtPaneHistory.setPreferredSize(new java.awt.Dimension(0, 6));
        edtPaneHistory.addHyperlinkListener(new javax.swing.event.HyperlinkListener() {
            public void hyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {
                edtPaneHistoryHyperlinkUpdate(evt);
            }
        });
        edtPaneHistory.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                edtPaneHistoryKeyTyped(evt);
            }
        });
        jScrollPane5.setViewportView(edtPaneHistory);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel2)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(jLabel3))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtRussian, javax.swing.GroupLayout.PREFERRED_SIZE, 191, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txtArabic, javax.swing.GroupLayout.PREFERRED_SIZE, 191, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addComponent(jScrollPane2)
                    .addComponent(jScrollPane5))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel4)
                    .addComponent(jLabel5)
                    .addComponent(jLabel6)
                    .addComponent(jLabel7)
                    .addComponent(jLabel12))
                .addGap(23, 23, 23)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(txtAddInfo3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 170, Short.MAX_VALUE)
                            .addComponent(txtAddInfo2, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtAddInfo1, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtKind, javax.swing.GroupLayout.Alignment.LEADING))
                        .addGap(18, 18, 18)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel8)
                            .addComponent(jLabel9)
                            .addComponent(jLabel10)
                            .addComponent(jLabel11))
                        .addGap(30, 30, 30)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtAddInfo7)
                            .addComponent(txtAddInfo6)
                            .addComponent(txtAddInfo5)
                            .addComponent(txtAddInfo4)))
                    .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 595, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(txtArabic, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtKind, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4)
                    .addComponent(txtAddInfo4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(txtRussian, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtAddInfo1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5)
                    .addComponent(txtAddInfo5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtAddInfo2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel6)
                        .addComponent(txtAddInfo6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel10))
                    .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtAddInfo3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel7)
                            .addComponent(txtAddInfo7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel11))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane3)
                            .addComponent(jLabel12)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 333, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        jTabbedPane1.addTab(bundle.getString("search"), jPanel1); // NOI18N

        jScrollPane1.setViewportView(tableArticles);

        jTabbedPane1.addTab(bundle.getString("all_words"), jScrollPane1); // NOI18N

        edtPaneTajwid.setEditable(false);
        edtPaneTajwid.setContentType("text/html"); // NOI18N
        edtPaneTajwid.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N
        edtPaneTajwid.setText("\t<style type=\"text/css\">\nH1 { margin-top: 1cm; color: rgb(0, 132, 209); text-align: center; page-break-before: auto; page-break-after: avoid; }H1.western { font-family: \"Times New Roman\",serif; font-size: 22pt; font-style: normal; font-weight: bold; }H1.cjk { font-family: \"DejaVu Sans\"; font-size: 16pt; font-weight: bold; }H1.ctl { font-family: \"Lohit Hindi\"; font-size: 16pt; font-weight: bold; }P { margin-bottom: 0.21cm; }[face=\"Lohit Hindi\"] { font-size: 14pt; }\t</style>\n<p align=\"RIGHT\" style=\"margin-bottom: 0cm; font-style: normal; font-weight: normal\">\n\t<font color=\"#579d1c\"><font face=\"Times New Roman, serif\"><font size=\"3\" style=\"font-size: 13pt\"><span lang=\"hi-IN\"><font color=\"#000000\">بسم</font> <font color=\"#ff3366\">الله</font> <font color=\"#33cc66\">الرحمن الرحيم</font></span></font></font></font></p>\n<p align=\"RIGHT\" style=\"margin-bottom: 0cm; font-style: normal; font-weight: normal\">\n\t<font color=\"#000000\"><font face=\"Times New Roman, serif\"><font size=\"3\" style=\"font-size: 13pt\"><span lang=\"hi-IN\">الحمد <font color=\"#ff3366\">لله</font> <font color=\"#ff3366\">رب</font> العالمين</span></font></font></font></p>\n<p align=\"RIGHT\" style=\"margin-bottom: 0cm; font-style: normal; font-weight: normal\">\n\t<font color=\"#000000\"><font face=\"Times New Roman, serif\"><font size=\"3\" style=\"font-size: 13pt\"><span lang=\"hi-IN\">السلام عليكم</span></font></font></font></p>\n<h1 class=\"western\">\n\t&nbsp;</h1>\n<h1 class=\"western\">\n\tТвердые и мягкие буквы</h1>\n<p style=\"margin-bottom: 0cm\">\n\tВсегда произносятся твердо: <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">خ</font></span></font>, <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ص</font></span></font>, <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ض</font></span></font>, <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ط</font></span></font>, <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ظ</font></span></font>, <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">غ</font></span></font>, <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ق</font></span></font>.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ل</font> </span></font>произносится твердо в слове Аллах, если ему предшествует буква с фатхой или даммой. В остальных случаях произносится мягко.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ر</font> </span></font>произносится твердо:</p>\n<p style=\"margin-bottom: 0cm\">\n\t1) если она с фатхой или даммой;</p>\n<p style=\"margin-bottom: 0cm\">\n\t2) если она с сукуном и ей предшествует буква с фатхой или даммой;</p>\n<p style=\"margin-bottom: 0cm\">\n\t3) если она с сукуном, ей предшествует буква с сукуном, перед которой, в свою очередь, стоит буква с фатхой или даммой;</p>\n<p style=\"margin-bottom: 0cm\">\n\t4) если она с сукуном и ей предшествует соединительная хамза;</p>\n<p style=\"margin-bottom: 0cm\">\n\t5) если после нее с сукуном, которой предшествует буква с кясрой, стоит одна из 7 твердых.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ر</font> </span></font>произносится мягко:</p>\n<p style=\"margin-bottom: 0cm\">\n\t1) если она с кясрой;</p>\n<p style=\"margin-bottom: 0cm\">\n\t2) если она с сукуном и ей предшествует буква с кясрой;</p>\n<p style=\"margin-bottom: 0cm\">\n\t3) если она с сукуном, ей предшествует буква с сукуном, перед которой буква с кясрой;</p>\n<p style=\"margin-bottom: 0cm\">\n\t4) если она с сукуном и перед ней <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ي</font> </span></font>с сукуном.</p>\n<p style=\"margin-bottom: 0cm\">\n\tПри твердых харфах фатха произноситься с настройкой на <font color=\"#dd4814\"><i><b>о</b></i></font>, а кясра &mdash; на <font color=\"#dd4814\"><i><b>ы</b></i></font>.</p>\n<p style=\"margin-bottom: 0cm\">\n\tОстальные харфы &mdash; мягкие.</p>\n<h1 class=\"western\">\n\tПроизношение звука &quot;н&quot; в букве &quot;нун&quot; с сукуном и танвине</h1>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Изхар</b></font>: <font color=\"#dd4814\"><i><b>н</b></i></font> произносится четко и ясно, если после нее следует одна из <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ح خ ع غ ه ء</font></span></font>. В качестве указания в некоторых изданиях Курана над <font color=\"#dd4814\"><i><b>н</b></i></font><font color=\"#dd4814\"><i><b>ун</b></i></font> ставится сукун, а танвины <font color=\"#dd4814\"><i><b>ан</b></i></font> и <font color=\"#dd4814\"><i><b>ин</b></i></font> отмечаются черточками строго одна под другой.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Идгам</b></font>: если <b>слово</b> заканчивается на <font color=\"#dd4814\"><i><b>н</b></i></font>, за которым следует одна из <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ر ل م ن و ي</font></span></font>, то звук <font color=\"#dd4814\"><i><b>н</b></i></font> поглощается, а одна из перечисленных удваивается. Причем левые четыре произносятся с назализацией. В качестве указания в некоторых изданиях Курана над <font color=\"#dd4814\"><i><b>н</b></i></font><font color=\"#dd4814\"><i><b>ун</b></i></font> не ставится сукун, а танвины <font color=\"#dd4814\"><i><b>ан</b></i></font> и <font color=\"#dd4814\"><i><b>ин</b></i></font> отмечаются черточками несколько смещенными относительно друг друга.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Икляб</b></font>: если после звука <font color=\"#dd4814\"><i><b>н</b></i></font> следует <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ب</font></span></font>, то вместо <font color=\"#dd4814\"><i><b>н</b></i></font> произносится <font color=\"#dd4814\"><i><b>м</b></i></font> на два счета с назализацией и неразрывно с <font color=\"#dd4814\"><i><b>б</b></i></font>. В качестве указания в некоторых изданиях Курана над <font color=\"#dd4814\"><i><b>н</b></i></font><font color=\"#dd4814\"><i><b>ун</b></i></font> вместо сукуна и вместо одной огласовки танвина пишется маленькая буква <font color=\"#dd4814\"><i><b>м</b></i></font><font color=\"#dd4814\"><i><b>им</b></i></font>.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Ихфа</b></font>: в остальных случаях <font color=\"#dd4814\"><i><b>н</b></i></font> произносится приглушенно на два счета с назализацией. В качестве указания в некоторых изданиях Курана над <font color=\"#dd4814\"><i><b>н</b></i></font><font color=\"#dd4814\"><i><b>ун</b></i></font> не ставится сукун, а танвины <font color=\"#dd4814\"><i><b>ан</b></i></font> и <font color=\"#dd4814\"><i><b>ин</b></i></font> отмечаются черточками несколько смещенными относительно друг друга.</p>\n<h1 class=\"western\">\n\tПроизношение звука &quot;м&quot; в букве &quot;мим&quot; с сукуном</h1>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Ихфа шафави</b></font>: если после <font color=\"#dd4814\"><i><b>м</b></i></font> следует <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ب</font></span></font>, то <font color=\"#dd4814\"><i><b>м</b></i></font> произносится на два счета с назализацией при сомкнутых губах. В качестве указания в некоторых изданиях Курана над <font color=\"#dd4814\"><i><b>м</b></i></font><font color=\"#dd4814\"><i><b>им</b></i></font> не ставится сукун.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Идгам шафави</b></font>: если после <font color=\"#dd4814\"><i><b>м</b></i></font> следует <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">م</font></span></font>, то <font color=\"#dd4814\"><i><b>м</b></i></font> первой буквы <font color=\"#dd4814\"><i><b>мим</b></i></font> с сукуном не читается, а второй произносится на два счета с назализацией при сомкнутых губах. В качестве указания в некоторых изданиях Курана над первой <font color=\"#dd4814\"><i><b>м</b></i></font><font color=\"#dd4814\"><i><b>им</b></i></font> не ставится сукун, а над второй ставится шадда.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Изхар шафави</b></font>: в остальных случаях <font color=\"#dd4814\"><i><b>м</b></i></font> произноситься четко и ясно.</p>\n<h1 class=\"western\">\n\tИдгам</h1>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Мутамасиляйн</b></font>: если в одном и том же или в двух разных словах встретятся две одинаковые буквы, причем первая будет с сукуном, а последующая &mdash; с любой из трех огласовок, то первая поглощается, а вторая удваивается. В качестве указания в некоторых изданиях Курана над первой буквой не ставится харакят, а над второй ставится шадда.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Мутаджанисайн</b></font>: если в одном и том же или в двух разных словах встретятся две схожие по месту образования буквы, причем первая будет с сукуном, а последующая &mdash; с любой из трех огласовок, то первая поглощается, а вторая удваивается. Это возможно в семи случаях:</p>\n<p style=\"margin-bottom: 0cm\">\n\t1) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ب</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">م</font></span></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t2) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ث</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ذ</font></span></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t3) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ذ</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ظ</font></span></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t4) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ت</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">د</font></span></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t5) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">د</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ت</font></span></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t6) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ت</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ط</font></span></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t7) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ط</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ت</font></span></font>. Однако в этом случае <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ط</font> </span></font>полностью не поглощается &mdash; с началом его произнесения происходит переход на следующую. В качестве указания в некоторых изданиях Курана над первой не ставится сукун, а над второй ставится шадда.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Мутакарибайн</b></font>: если в одном и том же или в двух разных словах встретятся две близкие по месту образования и свойствам буквы, причем первая будет с сукуном, а последующая &mdash; с любой из трех огласовок, то первая поглощается, а вторая удваивается. Это возможно в двух случаях:</p>\n<p style=\"margin-bottom: 0cm\">\n\t1) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ل</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ر</font></span></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t2) если после <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ق</font> </span></font>с сукуном стоит <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ك</font></span></font>.</p>\n<h1 class=\"western\">\n\tМад</h1>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Муттасыль</b></font>: если в одном слове после буквы удлинения стоит хамза, то долгий гласный удлиняется на 4-5, а в случае остановки &mdash; на 6 счетов.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Мунфасыль</b></font>: если буква удлинения стоит на конце одного слова, а следующее начинается с хамзы, то долгий гласный может удлиняется на 2, 4 или 5 счетов, но предпочтительней &mdash; на 4 или 5.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Лязым</b></font>: если в одном слове после буквы удлинения стоит постоянный сукун (включая удвоенные ташдидом арфы, т. к. первый считается с сукуном), то долгий гласный обязательно тянется на 6 счетов.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>&#39;арид ли сукун</b></font>: если за буквой удлинения стоит случайный сукун, образовавшийся по причине остановки чтения, то долгий гласный может тянутся на 2, 4 или 6 счетов.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#5c8526\"><b>Лин</b></font>: если на букве, следующей за <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ي</font> </span></font>или <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">و</font> </span></font>с сукуном, которым предшествует буква с фатхой, будет произведена остановка, т. е. появится случайный сукун, то звук данных букв тянется на 2, 4 или 6 счетов.</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#808080\">Примечания:</font></p>\n<p style=\"margin-bottom: 0cm\">\n\t1) первые аяты некоторых сур содержат только арфы. Такие буквы подлежат удлинению в 2 счета, за исключением алифа, который не тянется, и букв <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">س ص ع ك ق ل م ن</font></span></font>, на которые распространяется правило лязым;</p>\n<p style=\"margin-bottom: 0cm\">\n\t2) в качестве указания на правила мад в Куране проставлены волнистые линии;</p>\n<p style=\"margin-bottom: 0cm\">\n\t3) в рамках одного чтения для данного правила необходимо соблюдать одинаковую протяженность удлинения.</p>\n<h1 class=\"western\">\n\tЧтение буквы <font face=\"Lohit Hindi\"><font size=\"5\" style=\"font-size: 16pt\"><span lang=\"hi-IN\">ه </span></font></font>на конце слова</h1>\n<p style=\"margin-bottom: 0cm\">\n\tЕсли перед <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ه</font></span></font>, написанной на конце слова с даммой или кясрой (т. е. это слитное местоимение 3 лица, единственного числа, мужского рода), будет стоять буква с огласовкой, то огласовка для <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ه</font> </span></font>будет тянутся на 2 счета. А если в дополнении за ней следует разделительная хамза, то &mdash; на 6. Но если за ней следует буква с сукуном, то гласный не тянется. В качестве указания в некоторых изданиях Курана ставится маленькая <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ي</font> </span></font>или <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">و</font> </span></font>в соответствии с удлиняемым харокятом.</p>\n<h1 class=\"western\">\n\tКалькаля</h1>\n<p style=\"margin-bottom: 0cm\">\n\tЕсли над одной из <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ب ج د ط ق</font> </span></font>будет стоять сукун, то путем сотрясения и колебания места их образования, согласный звук выделяется звонким произношением. Причем это звуковое акцентирование происходит с большим усилием, когда на одной из этих букв делается пауза во время остановки чтения.</p>\n<h1 class=\"western\">\n\tПауза</h1>\n<p style=\"margin-bottom: 0cm\">\n\tПауза &mdash; прекращение чтения и остановка дыхания, приблизительно, на секунду. Есть в 4 местах: между 18:1 и 18:2; 36:52; 75:27; 83:14. В качестве указания в Куране ставится<font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\">ۜ </span></font><font color=\"#77216f\"> </font></font>.</p>\n<h1 class=\"western\">\n\tОстановка</h1>\n<p style=\"margin-bottom: 0cm\">\n\tМожет быть произведена по окончании аята - это сунна. Если не хватило дыхания, то на любом слове с дальнейшим его повторением при продолжении чтения, при этом лучше следовать следующим значкам:</p>\n<p style=\"margin-bottom: 0cm\">\n\t1)<font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\">ۖ</span></font><font color=\"#77216f\"> </font><font color=\"#77216f\"> </font></font>- остановка разрешена, но лучше продолжить;</p>\n<p style=\"margin-bottom: 0cm\">\n\t2)<font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\">ۗ</span></font><font color=\"#77216f\"> </font><font color=\"#77216f\"> </font></font>- остановка разрешена и лучше остановиться;</p>\n<p style=\"margin-bottom: 0cm\">\n\t3)<font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ۘ</font><font color=\"#77216f\"> </font><font color=\"#77216f\"> </font></span></font>- остановка обязательна;</p>\n<p style=\"margin-bottom: 0cm\">\n\t4)<font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ۙ</font><font color=\"#77216f\"> </font><font color=\"#77216f\"> </font></span></font>- остановка запрещена;</p>\n<p style=\"margin-bottom: 0cm\">\n\t5)<font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ۚ</font><font color=\"#77216f\"> </font><font color=\"#77216f\"> </font></span></font>- остановка разрешена;</p>\n<p style=\"margin-bottom: 0cm\">\n\t6) <font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\">ۛ ۛ</span></font><font color=\"#77216f\"> </font></font>- остановка допустима лишь в одном из мест, обозначенным<font color=\"#77216f\"><font face=\"Arial, sans-serif\"><font size=\"3\"><b> </b></font></font><font face=\"Lohit Hindi\"><span lang=\"hi-IN\">ۛ</span></font><font color=\"#77216f\"> </font></font>.</p>\n<p style=\"margin-bottom: 0cm\">\n\tПри остановке происходят следующие изменения:</p>\n<p style=\"margin-bottom: 0cm\">\n\t1) конечная огласовка преобразуется в сукун. Однако, если конечной буквой является <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ي</font> </span></font>или <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">و</font></span></font>, то она преобразуется в долгий гласный;</p>\n<p style=\"margin-bottom: 0cm\">\n\t2) конечная танвинная <font color=\"#dd4814\"><i><b>ан</b></i></font> преобразуется в долгий <font color=\"#dd4814\"><i><b>а</b></i></font>;</p>\n<p style=\"margin-bottom: 0cm\">\n\t3) конечная <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ة</font> </span></font>преобразуется в <font face=\"Lohit Hindi\"><span lang=\"hi-IN\"><font color=\"#77216f\">ه</font> </span></font>с сукуном.</p>\n<h1 class=\"western\">\n\tЧтение соединительной хамзы</h1>\n<p style=\"margin-bottom: 0cm\">\n\tВ начале произносимой речи соединительная хамза читается: с фатхой в определенном артикле; с даммой в глаголе, третья буква которой также с даммой; в остальных случаях с кясрой.</p>\n<p style=\"margin-bottom: 0cm\">\n\t&nbsp;</p>\n<p style=\"margin-bottom: 0cm\">\n\t&nbsp;</p>\n<p style=\"margin-bottom: 0cm\">\n\t<font color=\"#ff3366\"><i>Из Аббясова</i></font><font color=\"#ff3366\"><i> Р. Р.</i></font></p>"); // NOI18N
        jScrollPane10.setViewportView(edtPaneTajwid);

        jTabbedPane1.addTab(bundle.getString("tajwid"), jScrollPane10); // NOI18N

        edtPaneGrammarPart1.setEditable(false);
        edtPaneGrammarPart1.setContentType("text/html"); // NOI18N
        edtPaneGrammarPart1.setFont(new java.awt.Font("Ubuntu", 0, 20)); // NOI18N
        edtPaneGrammarPart1.setText(bundle.getString("grammar.part1")); // NOI18N
        jScrollPane4.setViewportView(edtPaneGrammarPart1);

        jTabbedPane1.addTab(bundle.getString("tenses"), jScrollPane4); // NOI18N

        edtPaneGrammarPart2.setEditable(false);
        edtPaneGrammarPart2.setContentType("text/html"); // NOI18N
        edtPaneGrammarPart2.setFont(new java.awt.Font("Ubuntu", 0, 20)); // NOI18N
        edtPaneGrammarPart2.setText(bundle.getString("grammar.part2")); // NOI18N
        jScrollPane8.setViewportView(edtPaneGrammarPart2);

        jTabbedPane1.addTab(bundle.getString("misc"), jScrollPane8); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 992, Short.MAX_VALUE)
                .addGap(0, 0, 0))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 730, Short.MAX_VALUE)
                .addGap(0, 0, 0))
        );

        jTabbedPane1.getAccessibleContext().setAccessibleName("");

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void lstFindingsValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_lstFindingsValueChanged
        if (!evt.getValueIsAdjusting() && !lstFindings.isSelectionEmpty()) {
            Article a = findings.get(lstFindings.getSelectedIndex());
            txtKind.setText(a.kind);
            txtAddInfo1.setText(a.addInfo1);
            txtAddInfo2.setText(a.addInfo2);
            txtAddInfo3.setText(a.addInfo3);
            txtAddInfo4.setText(a.addInfo4);
            txtAddInfo5.setText(a.addInfo5);
            txtAddInfo6.setText(a.addInfo6);
            txtAddInfo7.setText(a.addInfo7);
            txtArticle.setText(a.russian);
            txtArticle.setCaretPosition(0);
        }
    }//GEN-LAST:event_lstFindingsValueChanged

    private void txtRussianActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtRussianActionPerformed
        prepareForSearch();

        if (txtRussian.getText().length() > 0) {
            for (int i = 0; i < articles.size(); i++) {
                Article a = articles.get(i);
                if (a.russian.toLowerCase().matches(".*" + txtRussian.getText().toLowerCase() + ".*")) {
                    findings.add(a);
                }
            }
        }

        lstFindings.updateUI();
    }//GEN-LAST:event_txtRussianActionPerformed

    private void edtPaneHistoryHyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {//GEN-FIRST:event_edtPaneHistoryHyperlinkUpdate
        if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
            txtArabic.setText(evt.getURL().getHost());

            searchArabic(true);
        }
    }//GEN-LAST:event_edtPaneHistoryHyperlinkUpdate

    private void lstFindingsKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_lstFindingsKeyTyped
        newSearch(evt);
    }//GEN-LAST:event_lstFindingsKeyTyped

    private void txtArabicKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtArabicKeyTyped
        if (evt.getKeyChar() == '\n') {
            searchArabic(!evt.isControlDown());

            if (!findings.isEmpty() && !history.contains(txtArabic.getText())) {
                if (history.size() == HISTORY_SIZE) {
                    history.remove(HISTORY_SIZE - 1);
                }

                history.add(0, txtArabic.getText());

                String links = "";//"<style>a { text-decoration: none; }</style>";

                links += "<div style='text-align: right;'>";

                for (String h : history) {
                    links += "<a href='http://" + h + "' dir='rtl'>" + h + "</a> ";
                }

                links += "</div>";

                edtPaneHistory.setText(links);
            }
        }
    }//GEN-LAST:event_txtArabicKeyTyped

    private void edtPaneHistoryKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_edtPaneHistoryKeyTyped
        newSearch(evt);
    }//GEN-LAST:event_edtPaneHistoryKeyTyped

    private void txtArticleKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtArticleKeyTyped
        newSearch(evt);
    }//GEN-LAST:event_txtArticleKeyTyped

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;


                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainFrame.class
                    .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JEditorPane edtPaneGrammarPart1;
    private javax.swing.JEditorPane edtPaneGrammarPart2;
    private javax.swing.JEditorPane edtPaneHistory;
    private javax.swing.JEditorPane edtPaneTajwid;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane10;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JScrollPane jScrollPane8;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JList lstFindings;
    private javax.swing.JTable tableArticles;
    private javax.swing.JTextField txtAddInfo1;
    private javax.swing.JTextField txtAddInfo2;
    private javax.swing.JTextField txtAddInfo3;
    private javax.swing.JTextField txtAddInfo4;
    private javax.swing.JTextField txtAddInfo5;
    private javax.swing.JTextField txtAddInfo6;
    private javax.swing.JTextField txtAddInfo7;
    private javax.swing.JTextField txtArabic;
    private javax.swing.JTextArea txtArticle;
    private javax.swing.JTextField txtKind;
    private javax.swing.JTextField txtRussian;
    // End of variables declaration//GEN-END:variables

    private void loadDictionary() throws IOException {
        try (InputStreamReader isr = new InputStreamReader(MainFrame.class
                .getResourceAsStream("dict.txt"), "UTF-8");
                BufferedReader br = new BufferedReader(isr)) {

            String line;
            while ((line = br.readLine()) != null) {
                String[] split = line.split("\t", 11);
                if (split[0].equals("")) {
                    break;
                }
                Article a = new Article(Integer.parseInt(split[0]),
                        split[1],
                        split[2],
                        split[3],
                        split[4],
                        split[5],
                        split[6],
                        split[7],
                        split[8],
                        split[9],
                        split[10]);
                articles.add(a);
            }
        }
    }

    private void prepareForSearch() {
        lstFindings.clearSelection();
        txtKind.setText(null);
        txtAddInfo1.setText(null);
        txtAddInfo2.setText(null);
        txtAddInfo3.setText(null);
        txtAddInfo4.setText(null);
        txtAddInfo5.setText(null);
        txtAddInfo6.setText(null);
        txtAddInfo7.setText(null);
        txtArticle.setText(null);
        findings.clear();
    }

    private void searchArabic(boolean strict) {
        prepareForSearch();

        if (txtArabic.getText().length() > 0) {
            String arabic = txtArabic.getText().replaceAll(""
                    + (char) 1611 + "|"
                    + (char) 1612 + "|"
                    + (char) 1613 + "|"
                    + (char) 1614 + "|"
                    + (char) 1615 + "|"
                    + (char) 1616 + "|"
                    + (char) 1617 + "|"
                    + (char) 1618 + "|"
                    + (char) 1619 + "|"
                    + (char) 1620 + "|"
                    + (char) 1621 + "|", "").trim();

            for (Article a : articles) {
//            for (int i = 0; i < articles.size(); i++) {
//                Article a = articles.get(i);
//                System.out.println(a.base + "(" + Arrays.toString(a.base.getBytes()) + ") = " + txtWord.getText() + " (" + Arrays.toString(txtWord.getText().getBytes()) + ")");
                if (strict && (a.base.equals(arabic) || a.base3.equals(arabic) || a.base5.equals(arabic) || a.base7.equals(arabic))
                        || !strict && (a.base.contains(arabic) || a.base3.contains(arabic) || a.base5.contains(arabic) || a.base7.contains(arabic))) {
                    findings.add(a);
                }
            }
        }

        lstFindings.updateUI();

        txtArabic.selectAll();

        if (!findings.isEmpty()) {
            lstFindings.setSelectedIndex(0);

            if (findings.size() > 1) {
                lstFindings.requestFocusInWindow();
            }
        }
    }

    private void newSearch(KeyEvent evt) {
        if (!evt.isActionKey()) {
            txtArabic.requestFocusInWindow();
            if (!evt.isAltDown() && evt.getKeyChar() != '\n') {
                txtArabic.setText("" + evt.getKeyChar());
            }
        }
    }
}
